05. 条件布尔表达式

L3 04a 复杂的布尔表达式 V3

复杂的布尔表达式

If 语句有时候会使用更加复杂的条件布尔表达式。可能包括多个比较运算符、逻辑运算符,甚至包括算式。例如:

if 18.5 <= weight / height**2 < 25:
    print("BMI is considered 'normal'")

if is_raining and is_sunny:
    print("Is there a rainbow?")

if (not unsubscribed) and (location == "USA" or location == "CAN"):
    print("send email")

对于非常复杂的条件,你可能需要结合使用 and or not 。使用括号可以使运算符组合更清晰。

无论是简单还是复杂的条件, if 语句中的条件都必须是结果为 True 或 False 的布尔表达式,该值决定了 if 语句中的缩进代码块是否执行。

L3 04b 正反面示例 V3

正反面示例

在为 if 语句编写布尔表达式时,需要注意以下几个事项。

1. 请勿使用 True False 作为条件

# Bad example
if True:
    print("This indented code will always get run.")

虽然“True”是一个有效的布尔表达式,但不是有用的条件,因为它始终为 True,因此缩进代码将始终运行。同样, if False 也不应使用,该 if 语句之后的语句将从不运行。

# Another bad example
if is_cold or not is_cold:
    print("This indented code will always get run.")

同样,使用你知道将始终结果为 True 的条件(例如上述示例)也是毫无用途的。布尔表达式只能为 True 或 False,因此 is_cold not is_cold 将始终为 True,缩进代码将始终运行。

2. 在使用逻辑运算符编写表达式时,要谨慎

逻辑运算符 and or not 具有特定的含义,与字面英文意思不太一样。确保布尔表达式的结果和你预期的一样。

# Bad example
if weather == "snow" or "rain":
    print("Wear boots!")

这段代码在 Python 中是有效的,但不是布尔表达式,虽然读起来像。原因是 or 运算符右侧的表达式 "rain" 不是布尔表达式,它是一个字符串。稍后我们将讨论当你使用非布尔型对象替换布尔表达式时,会发生什么。

3. 请勿使用 == True == False 比较布尔变量

这种比较没必要,因为布尔变量本身是布尔表达式。

# Bad example
if is_cold == True:
    print("The weather is cold!")

这是一个有效的条件,但是我们可以使用变量本身作为条件,使代码更容易读懂,如下所示。

# Good example
if is_cold:
    print("The weather is cold!")

如果你想检查布尔表达式是否为 False,可以使用 not 运算符。

L3 04c 真假值测试 V3

真假值测试

如果我们在 if 语句中使用非布尔对象代替布尔表达式,Python 将检查其真假值,判断是否运行缩进代码。默认情况下,Python 中对象的真假值被视为 True,除非在文档中被指定为 False。

以下是在 Python 中被视为 False 的大多数内置对象:

  • 定义为 false 的常量: None False
  • 任何数字类型的零: 0 0.0 0j Decimal(0) Fraction(0, 1)
  • 空序列和空集合: ”” () [] {} set() range(0)

示例:

errors = 3
if errors:
    print("You have {} errors to fix!".format(errors))
else:
    print("No errors to fix!")

在上述代码中,errors 的真假值为 True,因为它是非零数字,因此输出了错误消息。这是一个编写 if 语句的简练方式。